# 带着二哈去旅行丶:ZZQ
# 生成时间：2021/12/5 下午4:57
"""本章将从网上下载数据集
访问并可视化数据两种常见存储格式，CSV和JSON
使用Python模块csv来处理CSV格式存储的天气数据，使用Matplotlib根据下载的数据创建图表
使用json访问以JSON格式存储的地址数据，使用Plotly绘制一副散点图
"""

# CSV文件：将数据作为一系列以逗号分隔的值写入文件
# "USW0025333","SITKPORT,AK,US","2018-01-01"
print('16.1.2 获取数据 ')
"""
import csv
filename = 'data/sitka_weather_07-2018_simple.csv'   # 读取文件路径
with open(filename) as f:
    reader = csv.reader(f)          # 创建csv文件阅读器
    header_row = next(reader)       # next()调用一次返回文件的下一行  只调用一次输出一行 包含文件头
    # print(header_row)               # 每项数据以元素存储在列表中
# 16.1.3 提取并读取数据
    highs = []                  
    for row in reader:          # 已经读取了头文件 循环将从第二行开始——实际数据。
        high = int(row[5])      # 每次执行循环时，都将索引5处的TMAX添加到highs末尾。
        highs.append(high)      # 在文件中，这项数据是以字符串形式存储，因此int()转换数据格式
print(highs)

# 16.1.2 打印文件头及其位置
#  for index, column_header in enumerate(header_row):  # enumerate()获取每个元素的索引及其值
#     print(index, column_header)
"""

print('16.1.4 绘制温度图表')
"""
import csv
import matplotlib.pyplot as plt
filename = 'data/sitka_weather_07-2018_simple.csv'   # 读取文件路径
with open(filename) as f:
    reader = csv.reader(f)          # 创建csv文件阅读器
    header_row = next(reader)       # next()调用一次返回文件的下一行  只调用一次输出一行 包含文件头
    highs = []
    for row in reader:          # 已经读取了头文件 循环将从第二行开始——实际数据。
        high = int(row[5])      # 每次执行循环时，都将索引5处的TMAX添加到highs末尾。
        highs.append(high)      # 在文件中，这项数据是以字符串形式存储，因此int()转换数据格式
# 根据最高温度绘制图形
plt.style.use('Solarize_Light2')
fig, ax = plt.subplots()
ax.plot(highs, c='red')

# 设置图形格式
ax.set_title('2018年7月每日最高温度', fontsize=24)      # 设置标题
ax.set_xlabel('', fontsize=16)                          # 设置x轴
ax.set_ylabel('温度（F）', fontsize=16)                 # 设置y轴
ax.tick_params(axis='both', which='major', labelsize=16)    # 设置刻度的样式 both影响x和y labelsize刻度标记字号

plt.show()
"""
print('16.1.6 在图表中添加日期')
"""
import csv
import matplotlib.pyplot as plt
from datetime import datetime

filename = 'data/sitka_weather_07-2018_simple.csv'   # 读取文件路径
with open(filename) as f:
    reader = csv.reader(f)          # 创建csv文件阅读器
    header_row = next(reader)       # next()调用一次返回文件的下一行  只调用一次输出一行 包含文件头
    dates, highs = [], []           # 从文件中获取最高日期和最高温度
    for row in reader:          # 已经读取了头文件 循环将从第二行开始——实际数据。
        current_data = datetime.strptime(row[2], '%Y-%m-%d')
# datatime类中的strptime()函数接受各种实参，来决定如何解读日期
        high = int(row[5])      # 每次执行循环时，都将索引5处的TMAX添加到highs末尾。
        dates.append(current_data)
        highs.append(high)      # 在文件中，这项数据是以字符串形式存储，因此int()转换数据格式
# 根据最高温度绘制图形
plt.style.use('Solarize_Light2')
fig, ax = plt.subplots()
ax.plot(dates, highs, c='red')

# 设置图形格式
ax.set_title('2018年7月每日最高温度', fontsize=24)      # 设置标题
ax.set_xlabel('', fontsize=16)                          # 设置x轴
fig.autofmt_xdate()                                     # 调用fig.autofmt_xdate()函数绘制倾斜的日期标签，避免重叠
ax.set_ylabel('温度（F）', fontsize=16)                 # 设置y轴
ax.tick_params(axis='both', which='major', labelsize=16)    # 设置刻度的样式 both影响x和y labelsize刻度标记字号

plt.show()
"""
print('16.1.7 涵盖更长时间')

import csv
import matplotlib.pyplot as plt
from datetime import datetime

filename = 'data/sitka_weather_2018_simple.csv'   # 读取文件路径
with open(filename) as f:
    reader = csv.reader(f)          # 创建csv文件阅读器
    header_row = next(reader)       # next()调用一次返回文件的下一行  只调用一次输出一行 包含文件头
    dates, highs = [], []           # 从文件中获取最高日期和最高温度
    for row in reader:          # 已经读取了头文件 循环将从第二行开始——实际数据。
        current_data = datetime.strptime(row[2], '%Y-%m-%d')
# datatime类中的strptime()函数接受各种实参，来决定如何解读日期
        high = int(row[5])      # 每次执行循环时，都将索引5处的TMAX添加到highs末尾。
        dates.append(current_data)
        highs.append(high)      # 在文件中，这项数据是以字符串形式存储，因此int()转换数据格式
# 根据最高温度绘制图形
plt.style.use('Solarize_Light2')
fig, ax = plt.subplots()
ax.plot(dates, highs, c='red')

# 设置图形格式
ax.set_title('2018年每日最高温度', fontsize=24)      # 设置标题
ax.set_xlabel('', fontsize=16)                          # 设置x轴
fig.autofmt_xdate()                                     # 调用fig.autofmt_xdate()函数绘制倾斜的日期标签，避免重叠
ax.set_ylabel('温度（F）', fontsize=16)                 # 设置y轴
ax.tick_params(axis='both', which='major', labelsize=16)    # 设置刻度的样式 both影响x和y labelsize刻度标记字号
plt.show()
